package com.jprocms.module.cms.service.content;

import com.baomidou.mybatisplus.extension.service.IService;
import com.jpro.framework.common.pojo.PageParam;
import com.jpro.framework.common.pojo.PageResult;
import com.jpro.module.bpm.enums.task.BpmProcessInstanceResultEnum;
import com.jprocms.module.cms.controller.admin.content.dto.ContentAutoPushDto;
import com.jprocms.module.cms.controller.admin.content.vo.*;
import com.jprocms.module.cms.dal.dataobject.content.ContentDO;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;

/**
 * 内容 Service 接口
 *
 * @author jprocms
 */
public interface ContentService extends IService<ContentDO> {

    /**
     * 创建内容
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createContent(@Valid ContentCreateReqVO createReqVO);

    /**
     * 更新内容
     *
     * @param updateReqVO 更新信息
     */
    void updateContent(@Valid ContentUpdateReqVO updateReqVO);

    /**
     * 更新内容并提交审核
     *
     * @param updateReqVO 更新信息
     */
    void updateContentAndSubmit(@Valid ContentUpdateReqVO updateReqVO);
    /**
     * 创建内容并提交
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createContentAndSubmit(@Valid ContentCreateReqVO createReqVO);
    /**
     * 删除内容
     *
     * @param id 编号
     */
    void deleteContent(Long id);

    void batchDeleteContent(List<Long> ids);

    /**
     * 彻底删除内容
     *
     * @param id 编号
     */
    void deleteTwoContent(Long id);

    void batchTwoDeleteContent(List<Long> ids);

    /**
     * 归档内容
     *
     * @param id 编号
     */
    void archiveContent(Long id);

    void batchArchiveContent(List<Long> ids);

    /**
     * 置顶内容
     *
     * @param topVo
     */

    void batchTopContent(ContentTopVo topVo);

    /**
     * 移动内容
     *
     * @param moveVo
     */
    void batchMoveContent(ContentMoveVo moveVo);

    /**
     * 标记内容
     *
     * @param markVo
     */
    void batchMarkContent(ContentMarkVo markVo);

    /**
     * 设置内容区块
     *
     * @param blockVo
     */
    void batchBlockContent(ContentBlockVo blockVo);


    /**
     * 批量复制内容
     *
     * @param copyVo
     */
    void batchCopyContent(ContentCopyVo copyVo, boolean submitWorkflow);

    void copyChannelContent(Long originChannelId, Long newChannelId, Long newSiteId);

    /**
     * 批量推送内容
     *
     * @param pushVo
     */
    void batchPushContent(ContentPushVo pushVo);

    /**
     * 自动推送内容
     *
     * @param pushVo
     */
    void autoPushContent(ContentAutoPushDto pushVo);

    /**
     * 发布内容
     *
     * @param ids
     */
    void batchPublish(List<Long> ids);

    /**
     * 下线内容
     *
     * @param ids
     */
    void batchOffline(List<Long> ids);

    /**
     * 提交工作流
     *
     * @param reqDTO
     */
    void submit(ContentSubmitVO reqDTO);

    /**
     * 审核通过
     *
     * @param reqVO
     */
    void approve(ContentTaskApproveReqVO reqVO);

    /**
     * 审核不通过
     *
     * @param reqVO
     */
    void reject(ContentTaskRejectReqVO reqVO);

    /**
     * 更新审核流程结果
     *
     * @param id     内容id
     * @param result 结果 {@link BpmProcessInstanceResultEnum }
     */
    void updateAuditResult(Long id, Integer result);

    /**
     * 获得内容
     *
     * @param id 编号
     * @return 内容
     */
    ContentDO getContent(Long id);

    /**
     * 获得内容列表
     *
     * @param ids    编号
     * @param status
     * @return 内容列表
     */
    List<ContentDO> getContentList(Collection<Long> ids, Integer status);


    /**
     * 获得内容列表
     *
     * @param ids    编号
     * @return 内容列表
     */
    List<ContentDO> getContentList(Collection<Long> ids);

    /**
     * 获得内容分页
     *
     * @param pageReqVO 分页查询
     * @return 内容分页
     */
    PageResult<ContentDO> getContentPage(ContentPageReqVO pageReqVO);

    /**
     * 获得内容列表
     *
     * @param pageReqVO 统计查询
     * @return 内容分页
     */
    List<ContentDO> getContentList(ContentStatQueryReqVO pageReqVO);

    /**
     * 获得内容排行分页（无权限过滤）
     *
     * @param pageReqVO 分页查询
     * @return 内容分页
     */
    PageResult<ContentDO> getContentPageIgnorePerm(ContentPageReqVO pageReqVO);

    /**
     * 获得前台内容查询分页
     *
     * @param pageReqVO 分页查询
     * @return 内容分页
     */
    PageResult<ContentDO> getContentPageFront(ContentFrontQueryReqVO pageReqVO);

    /**
     * 获得前台内容查询 不带分页查询
     *
     * @param reqVO 查询
     * @return 内容分页
     */
    List<ContentDO> getContentListFront(ContentFrontQueryReqVO reqVO);

    /**
     * 获得待审核内容分页
     *
     * @param pageReqVO 分页查询
     * @return 内容分页
     */
    PageResult<ContentDO> getTodoContentPage(PageParam pageReqVO);

    /**
     * 获得待审核内容总数
     *
     * @return 待审核内容总数
     */
    Long getTodoContentCount();

    /**
     * 查上下篇
     *
     * @param sideReqVO
     * @param next
     * @return 查上下篇
     */
    ContentDO findSide(ContentSideReqVO sideReqVO, boolean next);

    /**
     * 获得内容列表
     *
     * @param minId  最小内容查询id
     * @param siteId 站点id
     * @param status 状态
     * @param offset offset
     * @param limit  limit
     * @return 内容列表
     */
    List<ContentDO> getListByMinId(Long minId, Long siteId, Integer status, int offset, int limit);

    /**
     * @param channelId 栏目id
     * @param toRecycle 是否是进入回收站,true 内容进入回收站，false 则代表从回收站删除
     */
    void deleteContentsByChannelId(Long channelId, boolean toRecycle);

    /**
     * @param channelId 栏目id
     * @param status    目标状态
     */
    void updateContentsStatusByChannelId(Long channelId, Integer status);
}
